package com.xmg.p2p.base.service.impl;

import com.github.pagehelper.PageInfo;
import com.xmg.p2p.base.domain.RealAuth;
import com.xmg.p2p.base.domain.Userinfo;
import com.xmg.p2p.base.mapper.RealAuthMapper;
import com.xmg.p2p.base.query.PageResult;
import com.xmg.p2p.base.query.RealAuthQueryObject;
import com.xmg.p2p.base.service.RealAuthService;
import com.xmg.p2p.base.service.UserinfoService;
import com.xmg.p2p.base.util.BitStatesUtils;
import com.xmg.p2p.base.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @BelongsProject: jinrong-website
 * @BelongsPackage: com.xmg.p2p.base.service.impl
 * @author: Andy
 * @date: 2021.3.22 10:24
 * @Description: 实名认证业务层的实现类
 * @since JDK 1.8
 */
@Service
public class RealAuthServiceImpl implements RealAuthService {
    @Autowired
    private RealAuthMapper realAuthMapper;
    @Autowired
    private UserinfoService userinfoService;

    /**
     * 通过ID获取实名认证的信息
     * @param id
     * @return
     */
    @Override
    public RealAuth get(Long id) {
        RealAuth realAuth = realAuthMapper.selectByPrimaryKey(id);
        return realAuth;
    }

    /**
     * 进行保存实名认证
     * @param realAuth
     */
    @Override
    public void apply(RealAuth realAuth) {
        // 获取当前用户的信息
        Userinfo current = userinfoService.getById(UserContext.getCurrent().getId());
        // 创建实名认证实体类（做封装准备）
        RealAuth ra = new RealAuth();
        // 把前端传过来的数据进行封装
        ra.setRealName(realAuth.getRealName()); // 实名认证名字
        ra.setSex(realAuth.getSex());           // 实名认证性别
        ra.setIdNumber(realAuth.getIdNumber()); // 实名认证身份证号
        ra.setBornDate(realAuth.getBornDate()); // 实名认证时间
        ra.setAddress(realAuth.getAddress());   // 实名认证地址
        ra.setImage1(realAuth.getImage1());     // 身份正面
        ra.setImage2(realAuth.getImage2());     // 身份反面
        // 获取当前登录的对象 赋值给 申请人对象
        ra.setApplier(UserContext.getCurrent());    // 设置申请人信息
        ra.setApplyTime(new Date());            // 设置申请时间
        ra.setState(RealAuth.STATE_NORMAL);     // 设置实名认证的状态
        this.realAuthMapper.insert(ra);         // 进行持久化，把实名认证的信息插入数据库
        current.setRealAuthId(ra.getId());      // 设置实名认证ID到用户实体类中
        this.userinfoService.update(current);   // 持久化到数据库中
    }

    /**
     * 后台审核实名认证分页
     * @param queryObject 封装了查询的条件
     * @return
     */
    @Override
    public PageResult query(RealAuthQueryObject queryObject) {
        int i = this.realAuthMapper.queryForCount(queryObject);
        if (i > 0){
            List<RealAuth> query = this.realAuthMapper.query(queryObject);
            return new PageResult(query, i, queryObject.getCurrentPage(),
                    queryObject.getPageSize());
        }
        return PageResult.empty(queryObject.getPageSize());
    }

    /**
     * 进行审核的操作
     * @param id    用户的ID、实名认证的ID
     * @param remark     备注
     * @param state     状态
     */
    @Override
    public void audit(Long id, String remark, int state) {
        // 根据ID查询实名认证的对象
        RealAuth realAuth = realAuthMapper.selectByPrimaryKey(id);
        if (realAuth != null && realAuth.getState() == RealAuth.STATE_NORMAL){  // 如果实名认证处于待审核状态
            // 设置相关的属性
            Userinfo applier = this.userinfoService.getById(realAuth.getApplier().getId());  // 通过实名认证的ID获取审核人的信息（用户ID）
            /*为实名认证添加信息*/
            realAuth.setAuditor(UserContext.getCurrent());  // 设置审核人为此用户（往数据库添加的时候会通过此用户对象中获取对应的用户名进行添加，具体操作在Mapping中进行查看）
            realAuth.setRemark(remark);     // 设置详细信息
            realAuth.setAuditTime(new Date());      // 设置审核时间
            realAuth.setState(state);       // 审核状态
            if (!applier.getIsRealAuth()){      // 如果没有实名认证
                if (state == RealAuth.STATE_REJECT) {     // 如果传递过来的状态为审核失败的状态
                    applier.setRealAuthId(null);     // 把申请人的ID设置为null
                }else if (state == RealAuth.STATE_AUDIT){   // 如果传递过来的状态为审核成功的状态
                    // 添加状态码，设置实名认证相应的属性
                    applier.addState(BitStatesUtils.OP_REAL_AUTH);      // 已经实名认证
                    applier.setRealName(realAuth.getRealName());        // 设置用户信息的实名认证的姓名
                    applier.setIdNumber(realAuth.getIdNumber());        // 设置用户信息的实名认证的身份证号
                }
                this.userinfoService.update(applier);       // 进行数据的持久化！将没有实名认证进行实名认证（在用户添加了实名的名字和身份证号和实名的ID）
            }
            this.realAuthMapper.updateByPrimaryKey(realAuth);        // 进行数据的持久化！修改了实名认证的信息
        }
    }
}
